package Pack;
/**
 * Essa classe verifica a validade de Strings para
 * Nome, e-mail,Data e Telefone.
 */
public class Verificador {
	/**
	 * Verifica se o email passado eh valido, ou seja,
	 * esta no formato username@host.dominio e nao contem espacos ou
	 * caracteres invalidos : !@#$%^&*()'"<>~:;/|\?][{}
	 * @param email o e-mail a ser verificado.
	 * @return true se for valido ou false caso contrario.
	 */
	public static boolean ehEmailValido(String email){
		if (email.isEmpty()) {return false;}
		email.toLowerCase();
		int posicaoDoArroba = email.indexOf("@");
		if (posicaoDoArroba == -1 || posicaoDoArroba == 0 ){return false;}
		if (email.endsWith(".") || email.lastIndexOf(".") <= posicaoDoArroba +1){return false;	}
		String caracteresInvalidos = "!@#$%^&*()[]}{'\"<>~;:/|\\ ";
		for (int i = 0; i < posicaoDoArroba; i++){
			if (caracteresInvalidos.indexOf(email.charAt(i)) != -1){return false;}
		}
		for (int j = posicaoDoArroba +1; j < email.lastIndexOf("."); j++){
			if (caracteresInvalidos.indexOf(email.charAt(j)) != -1){return false;}
		}
		return true;
	}
	/**
	 * Verifica se um numero de telefone eh valido, ou seja,
	 * esta no formato (83)1234-5678.
	 * @param telefone O Telefone a ser verificado.
	 * @return true se for valido ou false caso contrario.
	 */
	public static boolean ehTelefoneValido(String telefone){
		if (telefone.length() !=13 || telefone.charAt(8)!= '-' 
			|| telefone.charAt(0)!= '(' || telefone.charAt(3)!= ')'){return false;}
		String numeros = "0987654321";
		for (int i = 0; i < telefone.length(); i++) {
			if ((i != 0 && i != 3 && i != 8) 
			&& numeros.indexOf(telefone.charAt(i)) == -1 ) {return false;}
		}
		return true;
	}

	/**
	 * Verifica se um nome de contato eh valido , ou seja, 
	 * nao eh vazio.
	 * @param nome O nome a ser verificado.
	 * @return true se for valido ,false caso o contrario.
	 */
	public static boolean ehNomeValido(String nome){
		if(nome.isEmpty()){return false;}
		for (int i = 0; i < nome.length(); i++) {
			if (nome.charAt(i)!= ' '){return true;}
		}
		return false;
	}
	/**
	 * Verifica se eh uma data valida no formato dd/mm.
	 * Note que 29/02 eh considerada valida.
	 * @param data a data a set verificada.
	 * @return true se for valida ou false caso contrario.
	 */
	public static boolean ehDataSemAnoValida(String data){
		if (data.length() != 5 || data.charAt(2) != '/') {return false;}
		int dia,mes;
		try{
		dia = Integer.parseInt(data.substring(0, 2));
		mes = Integer.parseInt(data.substring(3));
		}catch(NumberFormatException e){return false;}
		if (dia < 1 || dia > 31 || mes < 1 || mes > 12){return false;}
		if (mes == 2 && dia > 29){return false;}
		if ((mes==4||mes==6||mes==9||mes==11)&& dia==31){return false;}
		return true;
	}
	/**
	 * Verifica se uma data com ano eh valida,ou seja, esta em formato dd/mm/aaaa.
	 * Note que 29/02 eh valido apenas em anos bissextos.
	 * @param data A data a ser validada.
	 * @return true se for valida ou false caso contrario.
	 */
	public static boolean ehDataComAnoValida(String data){
		if(data.length()!=10 || data.charAt(5) != '/'){return false;}
		if(!ehDataSemAnoValida(data.substring(0,5))){return false;}
		int dia,mes,ano;
		try{
			dia = Integer.parseInt(data.substring(0,2));
			mes = Integer.parseInt(data.substring(3,5));
			ano = Integer.parseInt(data.substring(6));
		}catch(NumberFormatException e){return false;}
		if (ano < 1){return false;}
		if (dia == 29 && mes == 2){
			return ehAnoBissexto(ano);
		}
		return true;
	}
	
	private static boolean ehAnoBissexto(int ano)
	{
		if (ano%400 == 0){return true;}
		if (ano%4 == 0 && ano%100 != 0){return true;}
		return false;
	}
}
